
import sys, random

R = [32, 137, 239, 188, 102, 125, 221, 72, 212, 68, 81, 37, 86, 237, 147, 149,
    70, 229, 17, 124, 115, 207, 33, 20, 122, 143, 25, 215, 51, 183, 138, 142,
    146, 211, 110, 173,  1, 228, 189, 14, 103, 78, 162, 36, 253, 167, 116, 255,
    158, 45, 185, 50, 98, 168, 250, 235, 54, 141, 195, 247, 240, 63, 148,  2,
    224, 169, 214, 180, 62, 22, 117, 108, 19, 172, 161, 159, 160, 47, 43, 171,
    194, 175, 178, 56, 196, 112, 23, 220, 89, 21, 164, 130, 157,  8, 85, 251,
    216, 44, 94, 179, 226, 38, 90, 119, 40, 202, 34, 206, 35, 69, 231, 246,
    29, 109, 74, 71, 176,  6, 60, 145, 65, 13, 77, 151, 12, 127, 95, 199,
    57, 101,  5, 232, 150, 210, 129, 24, 181, 10, 121, 187, 48, 193, 139, 252,
    219, 64, 88, 233, 96, 128, 80, 53, 191, 144, 218, 11, 106, 132, 155, 104,
    91, 136, 31, 42, 243, 66, 126, 135, 30, 26, 87, 186, 182, 154, 242, 123,
    82, 166, 208, 39, 152, 190, 113, 205, 114, 105, 225, 84, 73, 163, 99, 111,
    204, 61, 200, 217, 170, 15, 198, 28, 192, 254, 134, 234, 222,  7, 236, 248,
    201, 41, 177, 156, 92, 131, 67, 249, 245, 184, 203,  9, 241,  0, 27, 46,
    133, 174, 75, 18, 93, 209, 100, 120, 76, 213, 16, 83,  4, 107, 140, 52,
    58, 55,  3, 244, 97, 197, 238, 227, 118, 49, 79, 230, 223, 165, 153, 59]

def next(S):
	while True:
		S = ( S * 1664525 + 1013904223) & 0xffffffff
		yield S

def shuffle(a, S):
	S = list(reversed(S))
	r = a[:]
	a = [0]
	while len(r) != 0:
		i = S[0]%(len(a))
		S = S[1:]
		a.insert(i,r.pop(-1))
	return a

def unshuffle(a, S):
	r = []
	a = a[:]
	while len(a) != 1: 
		i = S[0]%(len(a)-1)
		r.append(a.pop(i))		
		S = S[1:]
	return r

def gen_rotor(SID):
    g = next(SID)
    S1 = [ g.next() for i in range(len(R)) ]
    Q = shuffle(R,S1)
    G = unshuffle(Q,S1)
    assert G == R
    return '"' + ''.join(['\%03o'%i for i in Q[:-1]]) + '"'

if __name__ == '__main__':
    SID = int(random.random()*65535)
    rotor = gen_rotor(SID)
    sys.stdout.write("#define _ROTOR_SID %d\n"%SID)
    sys.stdout.write("#define _ROTOR %s\n\n"%rotor)


